package com.winner.data.util;

import java.time.LocalDate;
import java.time.YearMonth;
import java.time.format.DateTimeFormatter;
import java.time.temporal.ChronoUnit;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import cn.hutool.core.date.DatePattern;
import cn.hutool.core.date.DateTime;
import cn.hutool.core.date.DateUtil;

/**
 * @author wangxinle5
 * @since 2023-05-26
 */
public class DateUtils {

    // SimpleDateFormat是非线程安全的，因此如果多个线程共用一个SimpleDateFormat对象，在并发访问时容易出现问题。
    // 可以在使用时为每个线程创建一个独立的SimpleDateFormat对象，或者使用ThreadLocal来管理SimpleDateFormat对象。
    // DateTimeFormatter则是线程安全的，因此可以在多个线程之间共享一个DateTimeFormatter对象而不会有任何问题。
    static DateTimeFormatter formatter3 = DateTimeFormatter.ofPattern(DatePattern.PURE_DATETIME_PATTERN);

    public static void main(String[] args) {

        // 在线将时间戳转为北京时间  https://www.nntool.cc/time/shijianchuo/
        String date = DateUtil.date(1752720445L * 1000).toString();
        System.out.println("格林威治时间戳 转 beijing 时间是:" +date);

        // 当前时间 -480分钟
        DateTime d1 = DateUtil.offsetMinute(new Date(), -480);
        // 当前时间 -1天
        DateTime d2 = DateUtil.offsetDay(new Date(), -1);

        List<String> days = generateLastDays("2023-02-01", "2023-02-10");
        for (String day : days) {
            System.out.println(day);
        }

        List<String> strings = generateLastMonths("2023-04", "2024-03");
        System.out.println(strings);

        // 取当前月的上一个月
        String string = DateUtil.lastMonth().toString(DatePattern.NORM_MONTH_PATTERN);
        System.out.println(string);

        String today = DateUtil.today();
        // 2022-09-13
        System.out.println(today);

        DateTime tomorrow = DateUtil.tomorrow();
        // 明天 2022-09-14 08:55:15
        System.out.println(tomorrow);
        DateTime yesterday = DateUtil.yesterday();
        // 昨天 2022-09-12 08:55:15
        System.out.println(yesterday);

        // 两个日期比较用DateUtil.compare, 两个日期都为空, 也不会空指针异常
        // 前比后小，返回-1; 前比后大，返回1 ; 相等返回 0
        if (DateUtil.compare(DateUtil.parse(DateUtil.today()), null) <= 0) {
            // 后面null 返回false
            System.out.println("前面的日期 <= 后面的日期");
        }
        if (DateUtil.compare(DateUtil.parse("2023-05-25"), DateUtil.parse("2023-05-24")) >= 0) {
            System.out.println("前面的日期 >= 后面的日期");
        }

        // 如下三个传入
        Date a = null;
        // 不会空指针,会返回null
        System.out.println(DateUtil.format(a, DatePattern.NORM_DATE_PATTERN));

        /** 精确到秒：yyyy-MM-dd HH:mm:ss */
        System.out.println(DateUtil.format(new Date(), DatePattern.NORM_DATETIME_PATTERN));

        /** yyyy-MM-dd */
        System.out.println(DateUtil.format(new Date(), DatePattern.NORM_DATE_PATTERN));

        /** yyyyMMddHHmmss 用于文件时间戳 */
        System.out.println(DateUtil.format(new Date(), DatePattern.PURE_DATETIME_PATTERN));

        /** yyyy年MM月dd日 */
        System.out.println(DateUtil.format(new Date(), DatePattern.CHINESE_DATE_FORMAT));

        /** HH:mm:ss */
        System.out.println(DateUtil.format(new Date(), DatePattern.NORM_TIME_FORMAT));


        // 管你啥类型的都可以格式化 parse入参为空/空字符串,返回null,不会空指针报错
        DateTime dateTime1 = DateUtil.parse("2022-01-01");

        // 带时分秒, 就转为带时分秒的; 不带时分秒就转为不带时分秒的
        DateTime dateTime2 = DateUtil.parse("2011-01-01 11:11:11");

        // DateUtil.parseDate(带时分秒 不带时分秒 都是只转为不带时分秒的)
        DateTime dateTime3 = DateUtil.parseDate("2011-01-01");

        DateTime dateTim4 = DateUtil.parseUTC("2012-10-11T00:00:00.000Z");

    }

    public static String getFileTimeStamp() {
        return DateUtil.format(new Date(), DatePattern.PURE_DATETIME_PATTERN);
    }


    /**
     * 获取连续的年月
     *
     * @param startDate 开始年月
     * @param endDate 结束年月
     * @return 从小到大的年月
     */
    public static List<String> generateLastMonths(String startDate, String endDate) {
        // 使用YearMonth解析字符串创建起始和结束的年月对象
        DateTimeFormatter formatter = DatePattern.NORM_MONTH_FORMATTER;
        YearMonth startYearMonth = YearMonth.parse(startDate, formatter);
        YearMonth endYearMonth = YearMonth.parse(endDate, formatter);
        long until = YearMonth.from(startYearMonth).until(endYearMonth, ChronoUnit.MONTHS) + 1;
        List<String> monthList = new ArrayList<>();
        YearMonth currentMonth = YearMonth.parse(startDate, formatter);
        for (int i = 0; i < until; i++) {
            // monthList.add(currentMonth.minusMonths(i).format(formatter));
            monthList.add(currentMonth.plusMonths(i).format(formatter));
        }
        return monthList;
    }


    /**
     * 获取连续的年月日
     *
     * @param startDate 开始年月日
     * @param endDate 结束年月日
     * @return 从小到大的年月日
     */
    public static List<String> generateLastDays(String startDate, String endDate) {
        // 使用LocalDate解析字符串创建起始和结束的日期对象
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
        LocalDate startLocalDate = LocalDate.parse(startDate, formatter);
        LocalDate endLocalDate = LocalDate.parse(endDate, formatter);
        long until = ChronoUnit.DAYS.between(startLocalDate, endLocalDate) + 1;
        List<String> dayList = new ArrayList<>();
        LocalDate currentDate = startLocalDate;
        for (int i = 0; i < until; i++) {
            dayList.add(currentDate.plusDays(i).format(formatter));
        }
        return dayList;
    }


}
